package DeMaSoft;

import java.util.*;
import antcolony.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Fernando
 */
public class RouteCalculator implements Runnable {
    
    public static RouteCalculator _routeCalculator;
    
    public static final int ventana = 30;
    public static Mapa mapa;
    public static Almacen almacen;
    public static ArrayList<OrdenEntrega> ordenes = new ArrayList<>();
    public static String prefijo="dat";
    private boolean _detente=false;
    
    public static RouteCalculator getInstancia(){
        if (_routeCalculator == null)
            _routeCalculator = new RouteCalculator();
        return _routeCalculator;
    }
    
    public void correrSimulacion(){
        Thread simulacion = new Thread(this);
        simulacion.start(); 
        
    }
    
    public void detenerSimulacion(){
        this._detente = true;
    }

    @Override
    public void run(){
    Reloj reloj = Reloj.getInstancia();
        
        //crear mapa
        mapa = new Mapa(150, 100);
        //ubicar el almacen
        almacen = new Almacen(mapa.getPuntos().get(30 + 45 * mapa.getAlto()));// se ubica en 45,30
        //crear los vehículos(se crean en el almacen)
        GestorVehiculos.getInstancia().createVehicles();
        //crear el mapa de nodos para el algoritmo
        AntColony.createNodeMap();
        //empezar simulacion
        AntColony.initializeArcsPheromoneLevel();
        //iniciar tiempo a 00:00
        reloj.setReloj(0, 0, 17, 5, 2012);
        Calendar proxVentana = (Calendar)reloj.getFechaActual().clone();
        proxVentana.add(Calendar.MINUTE, ventana);
        
        Calendar proxDia = (Calendar)reloj.getFechaActual().clone();
        proxDia.add(Calendar.DAY_OF_MONTH, 1);
        try {
            ordenes = ManejaDatos.leeArchivo(prefijo);
        } catch (Exception ex) {
            Logger.getLogger(RouteCalculator.class.getName()).log(Level.SEVERE, null, ex);
        }

        ArrayList<OrdenEntrega> setOrd = ManejaDatos.sacaSetOrdenes(ordenes, 0, ventana, ventana);

        
        reloj.correrReloj();
        while (_detente==false) {
            if(proxVentana.compareTo(reloj.getFechaActual()) > 0)continue;
            proxVentana.add(Calendar.MINUTE, ventana);
            System.out.println("Fecha " + reloj.getFechaString("dd-MM-yyyy"));
            System.out.println("Hora: " + reloj.getHoraActual() + ":" + reloj.getMinutoActual());
            System.out.println("Numero pedidos: "+setOrd.size() + " ");
            System.out.print("Tiempo del algoritmo: ");
            Date b = new Date();
            AntColony.antColonyProcedure(GestorVehiculos.getInstancia().getVehiculos(), setOrd);
            
            /*for(int z = 0 ; z< 1;z++){
                System.out.println("Vehiculo "+z+":");
                for(int y =0; y<AntColony.bestSolutions.get(z).size();y++){
                    System.out.print("("+AntColony.bestSolutions.get(z).get(y).getX()+","+AntColony.bestSolutions.get(z).get(y).getY()+")");
                }
                System.out.println();
            }*/
            
            Date a = new Date();
            System.out.println(a.getTime()-b.getTime());
            ArrayList<OrdenEntrega> setOrdtemp=ManejaDatos.sacaSetOrdenes(ordenes, reloj.getHoraActual(), reloj.getMinutoActual(), ventana);
            setOrd.addAll(setOrdtemp);            
            GestorVehiculos.getInstancia().asignarRutas(AntColony.bestSolutions);
            GestorVehiculos.getInstancia().actualizarVehiculosYOrdenes(ventana,setOrd);
//            System.out.println("Numero pedidos: "+setOrd.size() + " " + setOrd.get(0).getNumPaquetes()+ " " + setOrd.get(1).getNumPaquetes());
            /*for(int i=0;i<GestorVehiculos.getInstancia().getVehiculos().size();i++){
                Vehicle v = GestorVehiculos.getInstancia().getVehiculos().get(i);
                System.out.println("Vehiculo "+i+":");
                for(int j=0;j< v.getRuta().size();j++ ){
                    System.out.print("("+v.getRuta().get(j).getPosX()+","+v.getRuta().get(j).getPosY()+") ");
                }
                System.out.println();
            }*/
            if(proxDia.compareTo(reloj.getFechaActual())<=0){
                proxDia = (Calendar)reloj.getFechaActual().clone();
                proxDia.add(Calendar.DAY_OF_MONTH, 1);
                try {
                    ordenes=ManejaDatos.leeArchivo(prefijo);
                } catch (Exception ex) {
                    Logger.getLogger(RouteCalculator.class.getName()).log(Level.SEVERE, null, ex);
                }
                
                if(ordenes==null){ 
                    reloj.detenerReloj();
                    break;
                    
                }
            }
        }
        return;    
    }
    public static void main(String[] args){
        RouteCalculator rC = RouteCalculator.getInstancia();
        rC.correrSimulacion();
    }
}
